/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.tesoreria.bc;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TemporalType;
import org.cip.esymons.tesoreria.be.ComprobanteEgreso;
import org.cip.esymons.tesoreria.be.DetComegreso;
import org.cip.esymons.tesoreria.be.EnumEstadoComprobanteEgreso;

/**
 *
 * @author Gilmar Montoya
 */
@Stateless
public class ComprobanteEgresoFacade implements ComprobanteEgresoFacadeLocal {

    @PersistenceContext
    private EntityManager em;

    public void create(ComprobanteEgreso comprobanteEgreso) {
        em.persist(comprobanteEgreso);
    }

    public void edit(ComprobanteEgreso comprobanteEgreso) {
        em.merge(comprobanteEgreso);
    }

    public void remove(ComprobanteEgreso comprobanteEgreso) {
        em.remove(em.merge(comprobanteEgreso));
    }

    public ComprobanteEgreso find(Object id) {
        try {
            return em.find(ComprobanteEgreso.class, id);
        } catch (Exception e) {
            return null;
        }
    }

    public List<ComprobanteEgreso> findAll() {
        try {
            return em.createQuery("select object(o) from ComprobanteEgreso as o").getResultList();
        } catch (Exception e) {
            return new ArrayList();
        }
    }

    public List<DetComegreso> listaDetalle(Long codigo) {
        try {
            return em.createQuery("select object(o) from DetComegreso as o Where o.comprobanteEgresoRelacionado.docCodigo=?1").setParameter(1, codigo).getResultList();
        } catch (Exception e) {
            return new ArrayList();
        }
    }

    public List<ComprobanteEgreso> vouchersDisponiblesCajaChica() {
        try {
            StringBuilder sb = new StringBuilder();
            sb.append(" SELECT ");
            sb.append(" distinct ce.*,dge.*,doc.* ");
            sb.append(" FROM  ");
            sb.append(" `tes_comprobante_egreso` ce INNER JOIN `tra_documento_generado` dge on dge.`doc_codigo` = ce.`fk_doc_codigodocgen` ");
            sb.append(" INNER JOIN `tra_documento` doc ON doc.`doc_codigo`=dge.`doc_codigo`   ");
            sb.append(" INNER JOIN `tes_det_comegreso` dce  ");
            sb.append(" on ce.`fk_doc_codigodocgen`=dce.`cod_comprobanteegreso`  ");
            sb.append(" INNER JOIN `tes_cuenta_egreso` cue ON cue.`ceg_codigo`=dce.`cod_cuentaegreso` ");
            sb.append(" WHERE cue.`ceg_tipo`=7 and cue.`ceg_estado`=1 and ce.`fk_doc_codigodocgen` NOT IN ");
            sb.append(" (SELECT    ");
            sb.append(" dcc.`fk_doc_codigodocgen` ");
            sb.append(" FROM  ");
            sb.append(" `tes_det_caja_chica` dcc WHERE dcc.`fk_doc_codigodocgen` is not NULL) ");
            return em.createNativeQuery(sb.toString(), ComprobanteEgreso.class).getResultList();
        } catch (Exception e) {
            return new ArrayList();
        }
    }

    public List<ComprobanteEgreso> buscarComprobantesEgreso(int tipo, String nombre, String nroVoucher, String nroDocEx,
            String cuentaEgreso, String banco, Date fecIniG, Date fecFinG, Date fecIniR, Date fecFinR, String numCheque, EnumEstadoComprobanteEgreso estadoComprobanteEgreso) {
        try {
            String[] criterios;
            StringBuilder sb = new StringBuilder();
            StringBuilder where = new StringBuilder();
            sb.append(" SELECT distinct tes_comprobante_egreso.*,tra_documento_generado.*,tra_documento.* ");
            sb.append(" FROM ");
            sb.append(" `tes_comprobante_egreso` tes_comprobante_egreso ");
            sb.append(" INNER JOIN `tra_documento_generado` tra_documento_generado ON tes_comprobante_egreso.`fk_doc_codigodocgen` = tra_documento_generado.`doc_codigo` ");
            sb.append(" INNER JOIN `tra_documento` tra_documento ON tra_documento_generado.`doc_codigo` = tra_documento.`doc_codigo` ");
            Integer cont = 0;
            if (tipo == 0) {
                if (nombre != null && !nombre.isEmpty()) {
                    String pat, mat, nom, dni, cip;
                    criterios = nombre.split(";");
                    pat = criterios[0].substring(1);
                    mat = criterios[1].substring(1);
                    nom = criterios[2].substring(1);
                    dni = criterios[3].substring(1);
                    cip = criterios[4].substring(1);
                    if (!dni.isEmpty() || !cip.isEmpty() || !pat.isEmpty() || !mat.isEmpty() || !nom.isEmpty()) {
                        sb.append(" INNER JOIN `gen_solicitante` gen_solicitante ON tra_documento.`fk_sol_codigo` = gen_solicitante.`sol_codigo` ");
                        sb.append(" INNER JOIN `gen_persona_natural` gen_persona_natural ON gen_solicitante.`sol_codigo` = gen_persona_natural.`per_codigo` ");
                    }
                    if (!dni.isEmpty() || !cip.isEmpty()) {
                        if (!dni.isEmpty()) {
                            where.append(" and gen_persona_natural.`per_nroDni` =?").append((++cont).toString());
                        }
                        if (!cip.isEmpty()) {
                            sb.append(" INNER JOIN `col_colegiado` col_colegiado ON gen_persona_natural.`per_codigo` = col_colegiado.`col_codigo` ");
                            where.append(" and col_colegiado.`col_numeroCip` =?").append((++cont).toString());
                        }
                    } else {
                        if (!pat.isEmpty()) {
                            where.append(" and gen_persona_natural.`per_apellidoPaterno` =?").append((++cont).toString());
                        }
                        if (!mat.isEmpty()) {
                            where.append(" and gen_persona_natural.`per_apellidoMaterno` =?").append((++cont).toString());
                        }
                        if (!nom.isEmpty()) {
                            where.append(" and gen_persona_natural.`per_nombres` like ?").append((++cont).toString());
                        }
                    }
                }
            }

            if (tipo == 1) {
                String raz, ruc;
                criterios = nombre.split(";");
                raz = criterios[0].substring(1);
                ruc = criterios[1].substring(1);
                if (!ruc.isEmpty() || !raz.isEmpty()) {
                    sb.append(" INNER JOIN `gen_solicitante` gen_solicitante ON tra_documento.`fk_sol_codigo` = gen_solicitante.`sol_codigo` ");
                    sb.append(" INNER JOIN `gen_persona_juridica` gen_persona_juridica ON gen_solicitante.`sol_codigo` = gen_persona_juridica.`emp_codigo` ");
                }
                if (!ruc.isEmpty()) {
                    where.append(" and gen_solicitante.`sol_ruc` =?").append((++cont).toString());
                } else {
                    if (!raz.isEmpty()) {
                        where.append(" and gen_persona_juridica.`emp_razonSocial` like ?").append((++cont).toString());
                    }
                }
            }

            if (cuentaEgreso != null && !cuentaEgreso.isEmpty()) {
                sb.append(" INNER JOIN `tes_det_comegreso` tes_det_comegreso ON tes_comprobante_egreso.`fk_doc_codigodocgen` = tes_det_comegreso.`cod_comprobanteegreso` ");
                where.append(" and tes_det_comegreso.`cod_cuentaegreso` =?").append((++cont).toString());
            }

            if (nroDocEx != null && !nroDocEx.isEmpty()) {
                if (cuentaEgreso != null && !cuentaEgreso.isEmpty()) {
                    sb.append("");
                } else {
                    sb.append(" INNER JOIN `tes_det_comegreso` tes_det_comegreso ON tes_comprobante_egreso.`fk_doc_codigodocgen` = tes_det_comegreso.`cod_comprobanteegreso` ");
                }
                sb.append(" INNER JOIN `tra_documento` tra_documento_A ON tes_det_comegreso.`cod_comprobante` = tra_documento_A.`doc_codigo` ");
                where.append(" and tra_documento_A.`doc_numero` =?").append((++cont).toString());
            }

            if (fecIniG != null && fecFinG != null) {
                where.append(" and (tes_comprobante_egreso.`coe_fechageneracion` between ?").append((++cont).toString());
                where.append(" and ?").append((++cont).toString()).append(") ");
            }

            if (fecIniR != null && fecFinR != null) {
                where.append(" and (tes_comprobante_egreso.`coe_fecharecepcion` between ?").append((++cont).toString());
                where.append(" and ?").append((++cont).toString()).append(") ");
            }

            if (nroVoucher != null && !nroVoucher.isEmpty()) {
                String ini, fin = "";
                criterios = nroVoucher.split("-");
                ini = criterios[0];
                if (criterios.length > 1) {
                    fin = criterios[1];
                }
                if (!ini.isEmpty() && !fin.isEmpty()) {
                    where.append(" and (tra_documento.`doc_numero` between ?").append((++cont).toString());
                    where.append(" and ?").append((++cont).toString()).append(" ) ");
                } else {
                    if (!ini.isEmpty()) {
                        where.append(" and tra_documento.`doc_numero` =?").append((++cont).toString());
                    }
                }
            }

            if (banco != null && !banco.isEmpty()) {
                String cuenta, nom, ruc;
                criterios = banco.split(";");
                cuenta = criterios[0].substring(1);
                nom = criterios[1].substring(1);
                ruc = criterios[2].substring(1);
                if (!ruc.isEmpty() || !cuenta.isEmpty() || !nom.isEmpty()) {
                    sb.append(" INNER JOIN `tes_cuenta_bancaria` tes_cuenta_bancaria ON tes_comprobante_egreso.`coe_numcuentacip` = tes_cuenta_bancaria.`cba_codigo` ");
                }
                if (!cuenta.isEmpty()) {
                    where.append(" and tes_cuenta_bancaria.`cba_numcuenta` =?").append((++cont).toString());
                } else {
                    if (!ruc.isEmpty() || !nom.isEmpty()) {
                        sb.append(" INNER JOIN `gen_persona_juridica` gen_persona_juridicaBa ON tes_cuenta_bancaria.`fk_ban_codigo` = gen_persona_juridicaBa.`emp_codigo` ");
                    }
                    if (!ruc.isEmpty()) {
                        sb.append(" INNER JOIN `gen_solicitante` gen_solicitanteBa ON gen_persona_juridicaBa.`emp_codigo` = gen_solicitanteBa.`sol_codigo` ");
                        where.append(" and gen_solicitanteBa.`sol_ruc` = ?").append((++cont).toString());
                    } else {
                        if (!nom.isEmpty()) {
                            where.append(" and gen_persona_juridicaBa.`emp_razonSocial` like ?").append((++cont).toString());
                        }
                    }
                }

            }

            if (estadoComprobanteEgreso != null) {
                where.append(" and tes_comprobante_egreso.`coe_estado` =?").append((++cont).toString());
            }

            if (numCheque != null && !numCheque.isEmpty()) {
                where.append(" and tes_comprobante_egreso.`coe_numchequeOperacion` =?").append((++cont).toString());
            }
            if (!where.toString().isEmpty()) {
                cont = 0;
                sb.append(" Where ").append(where.toString().substring(4));
                Query q = em.createNativeQuery(sb.toString(), ComprobanteEgreso.class);
                if (tipo == 0) {
                    if (nombre != null && !nombre.isEmpty()) {
                        String pat, mat, nom, dni, cip;
                        criterios = nombre.split(";");
                        pat = criterios[0].substring(1);
                        mat = criterios[1].substring(1);
                        nom = criterios[2].substring(1);
                        dni = criterios[3].substring(1);
                        cip = criterios[4].substring(1);
                        if (!dni.isEmpty() || !cip.isEmpty()) {
                            if (!dni.isEmpty()) {
                                q.setParameter(++cont, dni);
                            }
                            if (!cip.isEmpty()) {
                                q.setParameter(++cont, cip);
                            }
                        } else {
                            if (!pat.isEmpty()) {
                                q.setParameter(++cont, pat);
                            }
                            if (!mat.isEmpty()) {
                                q.setParameter(++cont, mat);
                            }
                            if (!nom.isEmpty()) {
                                q.setParameter(++cont, "%" + nom + "%");
                            }
                        }
                    }
                }

                if (tipo == 1) {
                    String raz, ruc;
                    criterios = nombre.split(";");
                    raz = criterios[0].substring(1);
                    ruc = criterios[1].substring(1);
                    if (!ruc.isEmpty()) {
                        q.setParameter(++cont, ruc);
                    } else {
                        if (!raz.isEmpty()) {
                            q.setParameter(++cont, "%" + raz + "%");
                        }
                    }
                }

                if (cuentaEgreso != null && !cuentaEgreso.isEmpty()) {
                    q.setParameter(++cont, cuentaEgreso);
                }

                if (nroDocEx != null && !nroDocEx.isEmpty()) {
                    q.setParameter(++cont, nroDocEx);
                }

                if (fecIniG != null && fecFinG != null) {
                    q.setParameter(++cont, fecIniG, TemporalType.DATE);
                    q.setParameter(++cont, fecFinG, TemporalType.DATE);
                }

                if (fecIniR != null && fecFinR != null) {
                    q.setParameter(++cont, fecIniR, TemporalType.DATE);
                    q.setParameter(++cont, fecFinR, TemporalType.DATE);
                }

                if (nroVoucher != null && !nroVoucher.isEmpty()) {
                    String ini, fin = "";
                    criterios = nroVoucher.split("-");
                    ini = criterios[0];
                    if (criterios.length > 1) {
                        fin = criterios[1];
                    }
                    if (!ini.isEmpty() && !fin.isEmpty()) {
                        q.setParameter(++cont, ini);
                        q.setParameter(++cont, fin);
                    } else {
                        if (!ini.isEmpty()) {
                            q.setParameter(++cont, ini);
                        }
                    }
                }

                if (banco != null && !banco.isEmpty()) {
                    String cuenta, nom, ruc;
                    criterios = banco.split(";");
                    cuenta = criterios[0].substring(1);
                    nom = criterios[1].substring(1);
                    ruc = criterios[2].substring(1);
                    if (!cuenta.isEmpty()) {
                        q.setParameter(++cont, cuenta);
                    } else {
                        if (!ruc.isEmpty()) {
                            q.setParameter(++cont, ruc);
                        } else {
                            if (!nom.isEmpty()) {
                                q.setParameter(++cont, "%" + nom + "%");
                            }
                        }
                    }

                }

                if (estadoComprobanteEgreso != null) {
                    q.setParameter(++cont, estadoComprobanteEgreso.ordinal());
                }

                if (numCheque != null && !numCheque.isEmpty()) {
                    q.setParameter(++cont, numCheque);
                }


                return q.getResultList();
            } else {
                return new ArrayList<ComprobanteEgreso>();
            }
        } catch (Exception e) {
            return new ArrayList<ComprobanteEgreso>();
        }
    }
}
